home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 4 / The 640 Meg Shareware Studio CD-ROM Volume IV (Data Express)(1994).ISO / clang / 120_01.zip / USERCODE.C < prev    next >
Text File  |  1993-06-01  |  3KB  |  118 lines

  1. /* HEADER: CUG120.24;
  2.    TITLE: USERCODE;
  3.    DATE: 12/00/1981;
  4.    DESCRIPTION: "Extend the filename syntax for ALL file I/O to allow a user area prefix
  5.     of the form n/ on all filenames.";
  6.    KEYWORDS: input/output,user numbers;
  7.    SYSTEM: CP/M 2.x;
  8.    FILENAME: USERCODE.C;
  9.    WARNINGS: "Doesn't work for writing a file into a different user area than the currently
  10.     active one because of a CP/M bug.";
  11.    CRC: 5E0B;
  12.    AUTHORS: Leor Zolman;
  13.    COMPILERS: BDS C;
  14. */
  15. /*
  16.     USERCODE.C: A Nice Idea Killed By A Stupid CP/M MisFeature.....
  17.  
  18.     Idea: Extend the filename syntax for user with ALL file I/O to
  19.           allow a user area prefix of the form "n/" on all filenames.
  20.  
  21.     Written by Leor Zolman, 12/81  
  22.  
  23.         ****************************************************************
  24.     **         FOR CP/M 2.x SYSTEMS ONLY!!!                          **
  25.         ****************************************************************
  26.  
  27.  
  28.     Generalized replacements for "open", "creat" and "unlink"
  29.     library functions, allowing a user area prefix to be attached
  30.     to all filenames (except those used as arguments to the "rename"
  31.     function). The new filename syntax becomes:
  32.  
  33.         [whitespace][nn/][d:][filename.ext]
  34.  
  35.     E.g, to reference file "foo.bar" on the currently logged disk in
  36.     user area 7, you'd use:
  37.  
  38.         7/foo.bar
  39.  
  40.     To reference foo.bar in user area 9 on disk b:, you'd say:
  41.  
  42.         9/b:foo.bar
  43.  
  44.     and so on. The user area prefix must always come first if both it and
  45.     a disk designator need to be specified. 
  46.  
  47.     NOTE: THIS WHOLE THING DOESN'T REALLY WORK FOR WRITING FILES INTO
  48.     USER AREAS DIFFERENT FROM THE CURRENTLY ACTIVE USER AREA, BECAUSE
  49.     GODDAMN CP/M DOESN'T LET YOU CLOSE A FILE THAT WAS OPENED IN A USER
  50.     AREA DIFFERENT FROM THE CURRENTLY ACTIVE ONE. DAMN!!!!!!!!!!!!!!!!!!!
  51.  
  52.     To install this library, follow these steps:
  53.         1) compile this file (USERCODE.C)
  54.         2) invoke CLIB and give it the following commands:
  55.             *o 0 usercode
  56.             *o 1 deff2
  57.             *e 1 open
  58.             *a 0 open_old
  59.             *e 1 creat
  60.             *a 0 creat_old
  61.             *e 1 unlink
  62.             *a 0 unlink_old
  63.             *c 0
  64.             *q
  65.         3) Link the programs you wish to have recognize the user code
  66.            on filenames by including "-f usercode" on the CLINK
  67.            command line.
  68. */
  69.  
  70. int open_old();
  71. int creat_old();
  72. int unlink_old();
  73.  
  74. open(filename, mode)
  75. {
  76.     return usercode(&open_old,filename,mode);
  77. }
  78.  
  79. creat(filename)
  80. {
  81.     return usercode(&creat_old,filename);
  82. }
  83.  
  84. unlink(filename)
  85. {
  86.     return usercode(&unlink_old,filename);
  87. }
  88.  
  89. int usercode(funcptr, filename, extra_arg)
  90. int (*funcptr)();
  91. char *filename;
  92. int extra_arg;
  93. {
  94.     int i, cur_user, new_user;
  95.     char *savnam;
  96.  
  97.     while (isspace(*filename)) filename++;    /* skip over whitespace    */
  98.     savnam = filename;        /* save in case of false start    */
  99.  
  100.     if (!isdigit(*filename)) return (*funcptr)(filename,extra_arg);
  101.  
  102.     cur_user = bdos(32, 0xff);    /* save current user number    */
  103.     new_user = atoi(filename);    /* get new user number        */
  104.     while (isdigit(*++filename))    /* skip over user number text    */
  105.         ;
  106.     if (*filename != '/' || new_user > 31)
  107.          return (*funcptr)(savnam,extra_arg);    
  108.     bdos(32,new_user);
  109.     i = (*funcptr)(filename + 1,extra_arg);
  110.     bdos(32,cur_user);
  111.     return i;
  112. }
  113.  
  114. omes:
  115.  
  116.         [whitespace][nn/][d:][filename.ext]
  117.  
  118.     E.g, to reference file "foo.bar" on the currently logged